iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 30
2

寫在前面

其實關於工程師還有很多沒介紹到的部份

比方說Vim這個如果你要學會架設server就一定要會的編輯器

還有最後一篇想講每個後端工程師都會用到的sql,但是後來想想一篇根本就講不完
最後私心選了資料結構

原本還想要前後端各找一個框架展示框架跟一般原生程式的差異
不過後來篇數有限,而且基本的型別指標之類的觀念比較重要所以就放棄了

另外原本想展示每種語言的特性,但實際上心有餘而力不足
比方說像是F#,應該有更像函數式語言的寫法,但是我寫不出來

遺珠

記憶體操作

如果你需要使用底層的實作,就需要了解實際上程式碼是怎麼運作的
就算使用了指標,也不代表你就掌握了記憶體

比方說golang雖然也提供了指標的使用,但實際上他的指標是封裝過的
像是

func (q *Queue) Push(value interface{}) {
	newnode := &node{value, nil}
	if q.Empty() {
		q.head = newnode
		q.rear = newnode
	} else {
		q.rear.next = newnode
		q.rear = newnode
	}
	q.length++
}

你可以在方法內建立一個指標,並且丟入到使用這個方法的物件中

但實際上如果你在c++這麼寫

void Queue::Push(unsigned input){
    node newnode = {input};
    if (this->Empty())
    {
        this->head = &newnode;
        this->rear = &newnode;
    }else{
        this->rear->next = &newnode;
        this->rear=&newnode;
    }
}

方法內的變數是建立在記憶體的stack內,當方法結束時,這個變數就消失了
也就是說最終你只會得到一堆指向null的指標
如下圖

https://ithelp.ithome.com.tw/upload/images/20200930/20127836bFtVLCunuN.png

區域變數放置在stack的好處是可以避免抓錯變數,因為stack特性的關係,當方法沒有結束沒辦法抓到下層的變數

而造成golang沒有回收掉方法內變數的理由在於golang內建垃圾回收機制,回收的方式在於他會去檢查每個記憶體位置上指向他的變數
因此當還有指標指向這個記憶體位置時便不會被回收
但C++就不會幫你做到這種程度,因此當你在實作像是C++這種低階語言時了解變數儲存於記憶體的方式是十分重要的

因此在c++若是你需要特地將變數放置於heap(也就是不會因為stack消失而移除的變數)
你就需要這麼宣告

void Queue::Push(unsigned input){
    node newnode = new newnode(input);
    if (this->Empty())
    {
        this->head = &newnode;
        this->rear = &newnode;
    }else{
        this->rear->next = &newnode;
        this->rear=&newnode;
    }
}

其實關於記憶體還有許多可以講的地方,不過這次我們就先到這裡

框架

其實除了之前在php介紹過的框架LAMP外
另外一個也很有名的是nodejs+express+mongodb+redis
讓你可以只使用js就架設好一個網站

到底什麼是框架?

框架就像是一個軟體的同梱包

https://ithelp.ithome.com.tw/upload/images/20200930/20127836btaF6XNP8d.jpg

讓你可以無視底層的實作直接操作功能

那我應該直接學框架還是先學語言?

我的意見是

當你能夠不使用框架做出一套東西時,你才去使用框架  

學會語言之後

我們來說說幾個未來你可能會碰到的網路服務

Github

我們已經介紹過了,不過我們這邊說說未來你可能會用到的地方吧

首先Github是絕對值得經營的社群(?)
用來展示你的語言與專案的好平台
但前提示你要學會Markdown,好讓你可以寫一個好的README

如果你是前端工程師,也建議你去學習Github Page
他可以讓你在完全不用碰後端的情況下就處理好一個靜態網站

像是這個就是我放置在Github上的靜態網站
用來當作專案的展示相當的方便,也不用去維護伺服器

如果你需要互動式網站,盡量避開伺服器的部份,使用js做純前端也是沒問題,比方說這個

如果你引用的是開源的library,通常都會提供Github連結
當你需要查看底層的實作時都可以上去看看,比方說這裡
也可以看看其他人是怎麼寫程式註解的

有些公司可能並不是把程式碼放在Github上而是在Gitlab上
Gitlab屬於開源的可以自己架設的程式碼倉庫
雖然要自行架設比較麻煩,但是相對的可客製化程度比較高

leetcode

Leetcode屬於工程師們的練功房
上面有許多的題目,可以練習邏輯思考
通常若是講求效能都會需要各種演算法的支持,學好資料結構會讓你輕鬆許多

在面試時附上Leetcode的紀錄也是一個不壞的作法

Stack Overflow

如果你是一個常常會需要google找答案的人,那你應該對這個網站不陌生
這是一個問答網站,專門給程式設計師專用

雖然使用google找尋自己的問題就會自動有stack overflow的連結冒出來
但是你還是可以趁有空時上去看看自己學的語言或領域通常會遇到哪些問題,就可以提前避開

IT邦

如果你使用的是中文搜尋,通常也會找到這裡
不過你都看到這裡了,相信我也不用多做介紹

之後你可能會碰到開始寫公司開的需求,這時候必須要注意到

程式設計理念

之前曾經幫公司寫過一個library
寫完後去跟同事講解如何使用時

同事: 阿這個設定檔是什麼?
我: 喔,就是你要先建立一個設定檔,我的library會去讀那個設定檔的內容
同事: 欸,阿跟我設定檔的名稱有衝突欸,我看看要怎麼修

這時候主管剛好經過

主管: library不應該限制使用者該如何使用,你應該只提供串接的方法就好,設定檔之類的就讓他自己去設定,再丟入你的方法

這時候我才想起程式的一個基本觀念

程式畢竟是要給人用的

所以應該要以使用者的角度出發,去想你的程式碼該怎麼設計,
而不是設計好之後再去要求使用者按照你的規範

結語的結語

希望所有看完十五種語言的讀者們不要以為這樣就把十五種語言學完了
其實目前進度大概只到我帶你們到大門前,讓你看清大門的長相而已
後續還要靠你們自己走上去按門鈴

最後分享一句話,大家共勉之

https://ithelp.ithome.com.tw/upload/images/20200930/20127836MlPmbivSWr.jpg

別怕一個練了一萬種踢腿的人,該怕一個練了一萬次踢腿的人


上一篇
附錄4. 資料結構 想刷leetcode? 學好資料結構跟演算法吧
系列文
你會十五種程式語言?不,我會十五種HelloWorld.為了避免這種狀況,因此寫了這篇:淺入淺出十五種程式語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言